package com.jumi.microservice.material.service.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jumi.microservice.material.domain.JmMaterialAttribute;
import com.jumi.microservice.material.domain.JmMaterialAttributeResp;
import com.jumi.microservice.material.domain.JmMaterialAttributeValue;
import com.jumi.microservice.material.domain.JmMaterialAttributeVo;
import com.jumi.microservice.material.domain.example.JmMaterialAttributeExample;
import com.jumi.microservice.material.domain.example.JmMaterialAttributeValueExample;
import com.jumi.microservice.material.exception.excelException.ImportContentExistedException;
import com.jumi.microservice.material.exception.excelException.ValueExistedException;
import com.jumi.microservice.material.mapper.JmMaterialAttributeMapper;
import com.jumi.microservice.material.mapper.JmMaterialAttributeValueMapper;
import com.jumi.microservice.material.service.JmMaterialAttributeService;

/**
 * @description: 商品属性service服务组件
 * @author: ZhangY
 */
@Service
public class JmMaterialAttributeServiceImpl implements JmMaterialAttributeService
{

	@Autowired
	private JmMaterialAttributeMapper materialAttributeMapper;

	@Autowired
	private JmMaterialAttributeValueMapper materialAttributeValueMapper;

	/**
	 * 增加
	 */
	@Override
	@Transactional
	public int add(JmMaterialAttributeVo attrVo)
	{
		//在同一属性下检查属性值重名
		String attrValuesString = attrVo.getAttrValues();
		String[] attrValuesList = attrValuesString.split(",");
		for (int i = 0; i < attrValuesList.length; i++)
		{
			for (int j = i + 1; j < attrValuesList.length; j++)
			{
				if (attrValuesList[i].equals(attrValuesList[j]))
				{
					return -1;
				}
			}
		}

		//检查属性重名
		JmMaterialAttributeExample jmMaterialAttributeExample = new JmMaterialAttributeExample();
		JmMaterialAttributeExample.Criteria attrExampleCriteria = jmMaterialAttributeExample.createCriteria();
		attrExampleCriteria.andAttrNameEqualTo(attrVo.getAttrName());
		attrExampleCriteria.andIsDelEqualTo(0);
		List<JmMaterialAttribute> attrs = materialAttributeMapper.selectByExample(jmMaterialAttributeExample);
		if (attrs.size() > 0)
		{
			//重名
			return 0;
		}
		//保存属性
		JmMaterialAttribute attr = new JmMaterialAttribute();
		BeanUtils.copyProperties(attrVo, attr);
		materialAttributeMapper.insertSelective(attr);
		attrVo.setAttrId(attr.getAttrId());
		//保存属性值
		String attrValueString = attrVo.getAttrValues();
		if (attrValueString != null && attrValueString.length() != 0)
		{
			String[] attrValues = attrValueString.split(",");
			for (String attrV : attrValues)
			{
				JmMaterialAttributeValue attrValue = new JmMaterialAttributeValue();
				attrValue.setAttrValueName(attrV);
				attrValue.setAttrId(attr.getAttrId());
				attrValue.setCreateBy(attr.getCreateBy());
				attrValue.setUpdateBy(attr.getUpdateBy());
				materialAttributeValueMapper.insertSelective(attrValue);
			}
		}
		return 1;
	}

	/**
	 * 修改
	 */
	@Override
	@Transactional
	public int update(String sttrValuesString, String attrId, String updateBy)
	{
		//在同一属性下检查属性值重名1 : 修改时添加的属性值中有重复
		String[] attrValuesList = sttrValuesString.split(",");
		for (int i = 0; i < attrValuesList.length; i++)
		{
			for (int j = i + 1; j < attrValuesList.length; j++)
			{
				if (attrValuesList[i].equals(attrValuesList[j]))
				{
					return -1;
				}
			}
		}

		//在同一属性下检查属性值重名2 : 修改时添加的属性的属性值在数据库中已存在.
		JmMaterialAttributeResp attributeResp = findById(Integer.valueOf(attrId));
		List<JmMaterialAttributeValue> attributeValueList = attributeResp.getAttributeValueList();
		ArrayList<String> attrValueNameList = new ArrayList<>();
		for (JmMaterialAttributeValue jmMaterialAttributeValue : attributeValueList)
		{
			String attrValueName = jmMaterialAttributeValue.getAttrValueName();
			attrValueNameList.add(attrValueName);
		}
		for (String attrV : attrValuesList)
		{
			if (attrValueNameList.contains(attrV))
			{
				return -2;
			}
		}

		for (String attrValue : attrValuesList)
		{
			JmMaterialAttributeValue attrVal = new JmMaterialAttributeValue();
			attrVal.setAttrValueName(attrValue);
			attrVal.setAttrId(Integer.valueOf(attrId));
			attrVal.setCreateBy(updateBy);
			attrVal.setUpdateBy(updateBy);
			materialAttributeValueMapper.insertSelective(attrVal);
		}
		return 1;
	}

	/**
	 * 删除
	 */
	@Override
	@Transactional
	public int deleteByIds(String[] attrIds, String updateBy)
	{
		//启动状态不能删除
		for (String attrId : attrIds)
		{
			JmMaterialAttributeExample jmMaterialAttributeExample = new JmMaterialAttributeExample();
			JmMaterialAttributeExample.Criteria attrExampleCriteria = jmMaterialAttributeExample.createCriteria();
			attrExampleCriteria.andAttrStatusEqualTo(1);
			attrExampleCriteria.andAttrIdEqualTo(Integer.valueOf(attrId));
			List<JmMaterialAttribute> attrs = materialAttributeMapper.selectByExample(jmMaterialAttributeExample);
			if (attrs.size() > 0)
			{
				return 0;
			}
		}
		for (String attrId : attrIds)
		{
			//删除属性
			materialAttributeMapper.deleteByPrimaryKey(Integer.valueOf(attrId), updateBy);

			//删除属性值
			JmMaterialAttributeValueExample jmMaterialAttributeValueExample = new JmMaterialAttributeValueExample();
			JmMaterialAttributeValueExample.Criteria attrValueExampleCriteria = jmMaterialAttributeValueExample.createCriteria();
			attrValueExampleCriteria.andAttrIdEqualTo(Integer.valueOf(attrId));
			List<JmMaterialAttributeValue> attrValueList = materialAttributeValueMapper.selectByExample(jmMaterialAttributeValueExample);
			if (attrValueList != null && !attrValueList.isEmpty())
			{
				for (JmMaterialAttributeValue attrVa : attrValueList)
				{
					materialAttributeValueMapper.deleteByPrimaryKey(attrVa.getAttrValueId(), updateBy);
				}
			}
		}
		return 1;
	}

	/**
	 * 设置状态
	 */
	@Override
	@Transactional
	public int setStatus(Integer attrId, Integer attrStatus, String updateBy)
	{
		//修改属性状态
		JmMaterialAttribute attr = new JmMaterialAttribute();
		attr.setAttrId(attrId);
		attr.setAttrStatus(attrStatus);
		attr.setUpdateBy(updateBy);
		materialAttributeMapper.updateByPrimaryKeySelective(attr);

		//修改属性值状态
		JmMaterialAttributeValueExample jmMaterialAttributeValueExample = new JmMaterialAttributeValueExample();
		JmMaterialAttributeValueExample.Criteria attrValueExampleCriteria = jmMaterialAttributeValueExample.createCriteria();
		attrValueExampleCriteria.andAttrIdEqualTo(attrId);
		List<JmMaterialAttributeValue> attrValueList = materialAttributeValueMapper.selectByExample(jmMaterialAttributeValueExample);
		if (attrValueList != null && !attrValueList.isEmpty())
		{
			for (JmMaterialAttributeValue attrVa : attrValueList)
			{
				attrVa.setAttrValueStatus(attrStatus);
				attrVa.setUpdateBy(updateBy);
				materialAttributeValueMapper.updateByPrimaryKeySelective(attrVa);
			}
		}
		return 0;
	}

	/**
	 * 查询一个
	 */
	@Override
	@Transactional
	public JmMaterialAttributeResp findById(Integer attrId)
	{
		JmMaterialAttributeResp resp = new JmMaterialAttributeResp();
		JmMaterialAttribute jmMaterialAttribute = materialAttributeMapper.selectByPrimaryKey(attrId);
		BeanUtils.copyProperties(jmMaterialAttribute, resp);

		JmMaterialAttributeValueExample valueExample = new JmMaterialAttributeValueExample();
		JmMaterialAttributeValueExample.Criteria criteria = valueExample.createCriteria();
		criteria.andAttrIdEqualTo(attrId);
		criteria.andIsDelNotEqualTo(1);
		List<JmMaterialAttributeValue> attributeValues = materialAttributeValueMapper.selectByExample(valueExample);

		resp.setAttributeValueList(attributeValues);
		return resp;
	}

	/**
	 * 条件+分页查询
	 */
	@Override
	@Transactional
	public PageInfo<JmMaterialAttributeResp> findPage(JmMaterialAttributeVo materialAttributeVo)
	{
		String value = materialAttributeVo.getAttrValue();
		JmMaterialAttributeExample jmMaterialAttributeExample = getJmMaterialAttributeExample(materialAttributeVo);

		//前端传了value
		if (StringUtils.isNotEmpty(value))
		{
			List<JmMaterialAttribute> attributes = materialAttributeMapper.selectByExample(jmMaterialAttributeExample);

			if (attributes != null && !attributes.isEmpty())
			{
				//属性集合attributeResps
				ArrayList<JmMaterialAttributeResp> attributeResps = new ArrayList<>();
				for (JmMaterialAttribute attribute : attributes)
				{
					JmMaterialAttributeResp attributeResp = findById(attribute.getAttrId());
					attributeResps.add(attributeResp);
				}

				//开始过滤attributeResps        当前过滤方式 : 根据条件进行与门并行模糊过滤.
				Iterator<JmMaterialAttributeResp> iterator = attributeResps.iterator();
				while (iterator.hasNext())
				{
					JmMaterialAttributeResp attributeResp = iterator.next();

					List<JmMaterialAttributeValue> valueList = attributeResp.getAttributeValueList();

					//如果当前attributeResp的valus不包含前端传的value,将该attributeResp从attributeResps中删除.
					StringBuilder valListBuilder = new StringBuilder();
					for (JmMaterialAttributeValue aValue : valueList)
					{
						String attrValueName = aValue.getAttrValueName();
						valListBuilder.append(attrValueName);
					}
					String valListString = valListBuilder.toString();
					if (!valListString.contains(value))
					{
						iterator.remove();
					}
				}

				//过滤完毕
				if (!attributeResps.isEmpty())
				{
					//将过滤后的attributeResps分页后返回.
					List<Integer> attrIdList = new ArrayList<>();
					for (JmMaterialAttributeResp attributeResp : attributeResps)
					{
						attrIdList.add(attributeResp.getAttrId());
					}

					JmMaterialAttributeExample attributeExample=new JmMaterialAttributeExample();
					JmMaterialAttributeExample.Criteria attributeCriteria = attributeExample.createCriteria();
					attributeCriteria.andAttrIdIn(attrIdList);
					Integer pageNumber = Integer.valueOf(materialAttributeVo.getPageNum());
					Integer pageSize = Integer.valueOf(materialAttributeVo.getPageSize());
					PageHelper.startPage(pageNumber,pageSize);
					List<JmMaterialAttribute> attrs = materialAttributeMapper.selectByExample(attributeExample);
					PageInfo<JmMaterialAttribute> info = new PageInfo<>(attrs);

					/*  方法一: 取值->重新赋值.
						List<JmMaterialAttribute> materialAttributes = info.getList();
					*/

					// 方法二: 将attrs封装为attributeRespList -> pageInfo.setList(attrs->转为reps对象)
					ArrayList<JmMaterialAttributeResp> attributeRespList = new ArrayList<>();
					for (JmMaterialAttribute attribute : attrs)
					{
						JmMaterialAttributeResp attributeResp = findById(attribute.getAttrId());
						attributeRespList.add(attributeResp);
					}
					PageInfo<JmMaterialAttributeResp> pageInfo = new PageInfo<>(attributeRespList);

					BeanUtils.copyProperties(info,pageInfo);

					pageInfo.setList(attributeRespList);
					return pageInfo;

					//处理attributeResps集合按传入分页条件分页后返回.  -- 手动分页  offset=起始索引.
					/*int offset= (pageNumber-1)*pageSize;
					int lastIndex=offset+pageSize-1;
					List<JmMaterialAttributeResp> attributeRespsForPage=null;
					try
					{
						attributeRespsForPage = attributeResps.subList(offset, lastIndex+1);
					}catch (IndexOutOfBoundsException e){
						 attributeRespsForPage = attributeResps.subList(offset, attributeResps.size()-1);
					}

					pageInfo.setList(attributeRespsForPage);
					return pageInfo;*/
				}
				else
				{
					return null;
				}
			}
			else
			{
				return null;
			}
		}
		//前端没传value
		else
		{
			PageHelper.startPage(Integer.valueOf(materialAttributeVo.getPageNum()), Integer.valueOf(materialAttributeVo.getPageSize()));
			List<JmMaterialAttribute> attributes = materialAttributeMapper.selectByExample(jmMaterialAttributeExample);
			if (attributes != null && !attributes.isEmpty())
			{
				PageInfo<JmMaterialAttribute> pageInfo = new PageInfo<>(attributes);

				//将attributes封装为attributeResps
				ArrayList<JmMaterialAttributeResp> attributeResps = new ArrayList<>();
				for (JmMaterialAttribute attribute : attributes)
				{
					JmMaterialAttributeResp attributeResp = findById(attribute.getAttrId());
					attributeResps.add(attributeResp);
				}
				PageInfo<JmMaterialAttributeResp> respPageInfo = new PageInfo<>(attributeResps);

				BeanUtils.copyProperties(pageInfo, respPageInfo);
				respPageInfo.setList(attributeResps);
				return respPageInfo;
			}
			else
			{
				return null;
			}
		}

	}

	/**
	 * 查所有属性
	 */
	@Override
	public List<JmMaterialAttributeResp> findAll()
	{
		JmMaterialAttributeExample jmMaterialAttributeExample = new JmMaterialAttributeExample();
		JmMaterialAttributeExample.Criteria criteria1 = jmMaterialAttributeExample.createCriteria();
		criteria1.andIsDelEqualTo(0);
		List<JmMaterialAttribute> attributes = materialAttributeMapper.selectByExample(jmMaterialAttributeExample);

		//属性
		ArrayList<JmMaterialAttributeResp> attributeResps = new ArrayList<>();
		if (attributes != null && !attributes.isEmpty())
		{
			for (JmMaterialAttribute attribute : attributes)
			{
				JmMaterialAttributeResp attributeResp = new JmMaterialAttributeResp();
				BeanUtils.copyProperties(attribute, attributeResp);
				attributeResps.add(attributeResp);
			}
		}

		//属性值
		if (!attributeResps.isEmpty())
		{
			for (JmMaterialAttributeResp attributeResp : attributeResps)
			{
				Integer attrId = attributeResp.getAttrId();
				JmMaterialAttributeValueExample valueExample = new JmMaterialAttributeValueExample();
				JmMaterialAttributeValueExample.Criteria criteria = valueExample.createCriteria();
				criteria.andAttrIdEqualTo(attrId);
				criteria.andIsDelEqualTo(0);
				List<JmMaterialAttributeValue> values = materialAttributeValueMapper.selectByExample(valueExample);
				attributeResp.setAttributeValueList(values);
			}

		}
		return attributeResps;
	}

	/**
	 * 属性Excel批量导入
	 */
	public void importAttrExcel(List<JmMaterialAttributeVo> list, Long uid, String name)
	{
		if (list.isEmpty())
		{
			throw new ImportContentExistedException("上传内容不能为空");
		}
		ArrayList<String> checkList = new ArrayList<>();
		for (JmMaterialAttributeVo vo : list)
		{
			if (checkList.contains(vo.getAttrName()))
			{
				throw new ImportContentExistedException("上传时不允许包含相同属性名");
			}
			checkList.add(vo.getAttrName());
		}

		for (JmMaterialAttributeVo attr : list)
		{
			String[] values = attr.getAttrValues().split(",");
			for (int i = 0; i < values.length; i++)
			{
				for (int j = i + 1; j < values.length; j++)
				{
					if (values[i].equals(values[j]))
					{
						throw new ImportContentExistedException("上传时不允许某属性下包含相同属性值名");
					}
				}
			}
		}

		for (JmMaterialAttributeVo attrVo : list)
		{
			attrVo.setCreateBy(name);
			attrVo.setUpdateBy(name);

			//检查重名
			JmMaterialAttributeExample jmMaterialAttributeExample = new JmMaterialAttributeExample();
			JmMaterialAttributeExample.Criteria attrExampleCriteria = jmMaterialAttributeExample.createCriteria();
			attrExampleCriteria.andAttrNameEqualTo(attrVo.getAttrName());
			attrExampleCriteria.andIsDelNotEqualTo(0);
			List<JmMaterialAttribute> attrs = materialAttributeMapper.selectByExample(jmMaterialAttributeExample);
			if (attrs.size() > 0)
			{
				//重名
				throw new ValueExistedException("数据库已存在相同数据");
			}
			//保存属性
			JmMaterialAttribute attr = new JmMaterialAttribute();
			BeanUtils.copyProperties(attrVo, attr);
			materialAttributeMapper.insertSelective(attr);

			//保存属性值
			String attrValueString = attrVo.getAttrValues();
			if (attrValueString != null && attrValueString.length() != 0)
			{
				String[] attrValues = attrValueString.split(",");
				for (String attrV : attrValues)
				{
					JmMaterialAttributeValue attrValue = new JmMaterialAttributeValue();
					attrValue.setAttrValueName(attrV);
					attrValue.setAttrId(attr.getAttrId());
					attrValue.setCreateBy(attr.getCreateBy());
					attrValue.setUpdateBy(attr.getUpdateBy());
					materialAttributeValueMapper.insertSelective(attrValue);
				}
			}
		}
	}

	@Override
	public ArrayList<String> findSamedAttrName(ArrayList<JmMaterialAttributeVo> attributeVoList)
	{
		List<String> attrNames = materialAttributeMapper.selectAllAttrNames();
		ArrayList<String> samedAttrNameList = new ArrayList<>();
		for (JmMaterialAttributeVo attributeVo : attributeVoList)
		{
			if (attrNames.contains(attributeVo.getAttrName()))
			{
				samedAttrNameList.add(attributeVo.getAttrName());
			}
		}
		return samedAttrNameList;
	}

	/**
	 * Vo->条件对象
	 */
	private JmMaterialAttributeExample getJmMaterialAttributeExample(JmMaterialAttributeVo materialAttributeVo)
	{
		JmMaterialAttributeExample jmMaterialAttributeExample = new JmMaterialAttributeExample();
		JmMaterialAttributeExample.Criteria criteria = jmMaterialAttributeExample.createCriteria();
		jmMaterialAttributeExample.setOrderByClause("update_time DESC");
		criteria.andIsDelNotEqualTo(1);

		if (materialAttributeVo != null)
		{
			if (materialAttributeVo.getAttrName() != null && materialAttributeVo.getAttrName().length() > 0)
			{
				criteria.andAttrNameLike("%" + materialAttributeVo.getAttrName() + "%");
			}
			if (materialAttributeVo.getCreateBy() != null && materialAttributeVo.getCreateBy().length() > 0)
			{
				criteria.andCreateByLike("%" + materialAttributeVo.getCreateBy() + "%");
			}
			if (materialAttributeVo.getUpdateBy() != null && materialAttributeVo.getUpdateBy().length() > 0)
			{
				criteria.andUpdateByLike("%" + materialAttributeVo.getUpdateBy() + "%");
			}
			//状态
			if (materialAttributeVo.getAttrStatus() != null)
			{
				criteria.andAttrStatusEqualTo(materialAttributeVo.getAttrStatus());
			}
			//开始时间
			if (materialAttributeVo.getStartTime() != null)
			{
				criteria.andUpdateTimeGreaterThanOrEqualTo(materialAttributeVo.getStartTime());
			}
			//结束时间
			if (materialAttributeVo.getEndTime() != null)
			{
				criteria.andUpdateTimeLessThanOrEqualTo(materialAttributeVo.getEndTime());
			}
		}
		return jmMaterialAttributeExample;
	}
}
